#include <iostream>
#include <math.h>
using namespace std; 

int main(){
	// 两个输入四元数
	float w0,x0,y0,z0;
	w0 = 0.74f;
	x0 = 0.5f;
	y0 = 0.5f;
	z0 = 0.5f;
	float w1,x1,y1,z1;
	w1 = 0.74f;
	x1 = 0.8f;
	y1 = 0.8f;
	z1 = 0.8f;
	// 插值变量
	float t;
	t = 0.5f;
	// 输出的四元数
	float w,x,y,z;
	// 用点乘计算两四元数夹角的cos值，利用的点乘公式，又因为四元数是单位单位向量
	float cosOmega = w0*w1 + x0*x1 + y0*y1 + z0*z1;
	// 如果点乘为负，则反转一个四元数以取得短的4D“弧”
	if(cosOmega < 0.0f){
		w1 = -w1;
		x1 = -x1;
		y1 = -y1;
		z1 = -z1;
		cosOmega = -cosOmega;
	}
	// 检查它们是否过于接近以避免除零
	float k0, k1;
	if(cosOmega > .9999f){
		// 非常接近--即线性插值
		k0 = 1.0f-t;
		k1 = t;
	}else{
		// 用三角公式sin^2(omeqa) + cos^2(omeqa) = 1计算sin值
		float sinOmega = sqrt(1.0f - cosOmega*cosOmega);
		// 通过sin和cos计算角度
		float omega = atan2(sinOmega, cosOmega);
		// omega2和omega同等
		// float omega2 = acos(cosOmega);
		
		// 计算分母的倒数，这样就只需要一次除法
		float oneOverSinOmega = 1.0f / sinOmega;
		// 计算插值变量
		k0 = sin((1.0f - t) * omega) * oneOverSinOmega;
		k1 = sin(t * omega) * oneOverSinOmega;
	}
	// 插值
	w = w0*k0 + w1*k1;
	x = x0*k0 + x1*k1;
	y = y0*k0 + y1*k1;
	z = z0*k0 + z1*k1;
	cout<<w<<endl;
	cout<<x<<endl;
	cout<<y<<endl;
	cout<<z<<endl;
	// 输出0.74 0.65 0.65 0.65
}